package cn.iocoder.yudao.module.design.service.houseUserRel;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.design.controller.admin.house.vo.HouseTaskStaticResVO;
import cn.iocoder.yudao.module.design.controller.admin.house.vo.HouseTwoUserReqVO;
import cn.iocoder.yudao.module.design.controller.admin.houseUserRel.vo.*;
import cn.iocoder.yudao.module.design.dal.dataobject.houseUserRel.HouseUserRelDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 住宅相关用户关联 Service 接口
 *
 * @author 芋道源码
 */
public interface HouseUserRelService {

    /**
     * 创建住宅相关用户关联
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createHouseUserRel(@Valid HouseUserRelCreateReqVO createReqVO);

    /**
     * 更新住宅相关用户关联
     *
     * @param updateReqVO 更新信息
     */
    void updateHouseUserRel(@Valid HouseUserRelUpdateReqVO updateReqVO);

    /**
     * 删除住宅相关用户关联
     *
     * @param id 编号
     */
    void deleteHouseUserRel(Long id);

    /**
     * 获得住宅相关用户关联
     *
     * @param id 编号
     * @return 住宅相关用户关联
     */
    HouseUserRelDO getHouseUserRel(Long id);


    /**
     * 获得住宅相关用户关联
     *
     * @param houseId 编号
     * @return 住宅相关用户关联
     */
    HouseUserRelDO getHouseUserRelByHouseIdAndRoleId(Long houseId,Long roleId);


    /**
     * 获得住宅相关用户关联列表
     *
     * @param ids 编号
     * @return 住宅相关用户关联列表
     */
    List<HouseUserRelDO> getHouseUserRelList(Collection<Long> ids);
    /**
     * 获得住宅相关用户关联列表
     *
     * @param houseUserRelDO 编号
     * @return 住宅相关用户关联列表
     */
    List<HouseUserRelDO> getHouseUserRelList(HouseUserRelDO houseUserRelDO);
    /**
     * 获得住宅相关用户关联分页
     *
     * @param pageReqVO 分页查询
     * @return 住宅相关用户关联分页
     */
    PageResult<HouseUserRelDO> getHouseUserRelPage(HouseUserRelPageReqVO pageReqVO);

    /**
     * 获得住宅相关用户关联列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 住宅相关用户关联列表
     */
    List<HouseUserRelDO> getHouseUserRelList(HouseUserRelExportReqVO exportReqVO);


    /**
     * 获取项目关联人员信息
     * @param vo
     * @return
     */
    List<UserRelListVO> getUserRelList(HouseUserRelBaseVO vo );


    void validateUserIsRole(Long houseId, long userId, Long roleId);
    /**
     * 校验设计师 业主是否存在
     * @throws
     */
    void validateRoleInHouse(Long houseId,Long roleId);

    HouseUserRelDO getHouseUserRelByHouseIdAndUserId(Long houseId, Long userId);

    List<String> getHouseRolesByHouseIdAndUserId(Long houseId, Long userId);


    default Map<Long, HouseUserRelDO> getMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getHouseUserRelList(ids), HouseUserRelDO::getHouseId);
    }

    List<HouseTaskStaticResVO> getHouseTaskStatic(Long id);

    List<UserRelListVO> getUserRelList(Long houseId, Long roleId);

    /**
     *  保存单个项目关联人  状态为0 带发起
     * @param[1] houseId
     * @param[2] userId
     * @param[3] roleId
     */
   void saveHouseUserRel(Long houseId,Long userId ,Long roleId);

    /**
     *  保存单个项目关联人  状态为0 带发起
     * @param[1] houseId
     * @param[2] userId
     * @param[3] roleId
     */
    void saveHouseUserRel(Long houseId, Long userId , Long roleId, Integer statusCd);

   /**
    * 查询步骤2 关联人信息
    * @author Annie
    * @time 2023/10/8 10:42
    * @param[1] houseId
    * @return List<HouseTwoUserReqVO>
    * @throws
    */
   List<HouseTwoUserReqVO> getHouseTwoUserList(Long houseId);

    List<HouseTwoUserReqVO> getHouseTwoUserList(Long houseId,List<Long> roleList);
    /**
     * 移除预处理角色
     * @throws
     */
    void deleteHouseUseRel(Long houseId, Long roleId);


    Long queryHouseUserRelRoleExits(Long houseId, Long roleId);


    List<HouseUserRelDO> getHouseUserRelByHouseIdAndUserIdAndRoleId(Long houseId, Long userId, Long roleId);

    List<UserRelListVO> getUserRelGroupConcatList(Long houseId);
}
